package Calculadora;

/***************************************************************
 *  Calculadora.java        
 *  Fecha: 17/07/12
 *  Carnet: 11033
 *  @author Juan Pablo Argueta Cortes
 *  Clase que crea una Calculadora que maneja formato postfix
 ***************************************************************/
public class Calculadora {
    private int operando1;
    private int operando2;
    private boolean error;
    private StackVector<Integer> pila;
    
    /**
     * Método constructor que crea una nueva calculadora e instancia su Pila.
     */
    public Calculadora()
    // post: Constructs a new Calculadora.
    {
        pila = new StackVector<Integer>();
        error = false;
    }
    
    /**
     * Método que evalua la operación ingresada y realiza las operaciones necesarias
     * para llevarla a cabo.
     * @param cadena de texto que fue ingresada por el usuario
     * @return el último elemento de la pila que contiene el resultado, o 0 en el caso de
     *         que existiera un error.
     */
    public int getCalculo(String cadena)
    // post: Devuleve el resultado de la operación ingresada.
    {     
        cadena = cadena.replace(" ", "");
        for (int i=0; i<cadena.length(); i++){
            try{
                pila.push(Integer.parseInt(""+cadena.charAt(i)));
            }
            catch (Exception e){
                if (pila.size()<2){
                    error = true;
                    return 0;
                }
                operando1 = pila.pop();
                operando2 = pila.pop();
                switch (cadena.charAt(i)){
                    case '+':
                        pila.push(operando1+operando2);
                        break;
                    case '-':
                        pila.push(operando2-operando1);
                        break;
                    case '*':
                        pila.push(operando1*operando2);
                        break;
                    case '/':
                        pila.push(operando2/operando1);
                        break;
                    default:
                        error = true;
                        return 0;
                }
            }
        }
        return pila.pop();
    }
    
    /**
     * Método que indica si hubo un error en ingreso de la operación.
     * @return true si hubo error, false de lo contrario.
     */
    public boolean getError()
    // post: El valor del atributo error.
    {
        return error;
    }
    
}
